package com.wx.gof.pattern.creational.singleton;

import java.io.Serializable;

/**
 * @ClassName Application
 * @Author wx
 * @Description 单例模式-饿汉(类一加载就创建对象)
 * @Date 2018-12-05
 */
public class HungrySingleton implements Serializable{
    /**
     * 1.注意对象静态属性不需要设置final 也能在类加的准备阶段做赋值动作
     * 2.基本数据类型则需要要使用final  在准备阶段就能正确的赋值，否则的话，要等到初始化阶段。
     */
    private  static HungrySingleton hungrySingleton   = new HungrySingleton();

    private HungrySingleton(){
        if(hungrySingleton != null){
            throw new RuntimeException("单例构造器禁止反射调用");
        }
    }
    public static HungrySingleton getInstance(){
        return hungrySingleton;
    }


    /**
     * 防止序列化破坏单例性 在反序列化的时候，反序列化源码会对实现了Serializable接口的类，使用反射创建新的返回对象，
     * 接着后面会判断这个类是否有readResolve方法，有readResolve方法就会反射执行该方法，然后覆盖返回的对象，如果没有readResolve
     * 方法就直接返回反射创建的新对象
     */
    private Object readResolve(){
        return hungrySingleton;
    }

}
